
#include "DBC_t.hh"
#include <QtTest/QtTest>
#include "DBC.hpp"
#include "Ex.hh"
#include "Debug.hh"


using namespace std;
using namespace TC;



namespace { 

  struct DBCTester
  {
    bool m_mood;
    bool invariant() const { return m_mood; }

    void testInvariant1()  
    { TC_INVARIANT(); }

    void testInvariant2() 
    { TC_CHECK_INVARIANT(invariant()); }

    void preCondition()
    { TC_PRE_CONDITION(m_mood); }

    void postCondition()
    { TC_POST_CONDITION(m_mood); }
    
  }; // end class


} // end namespace



void DBC_t::tests()
{

  DBCTester t;

  //
  // Positive tests
  //
  t.m_mood = true;
  t.testInvariant1();
  t.testInvariant2();
  t.preCondition();
  t.postCondition();


  //
  // Negative tests
  //
  t.m_mood = false;
  try {
    t.testInvariant1(); // should throw
    QVERIFY(false);
  } 
  catch(const Ex&) {
    // Success
  }
  catch(...) {
    throw; // Failure
  }
  QVERIFY(true);
  

  try {
    t.testInvariant2(); // should throw
    QVERIFY(false);
  } 
  catch(const Ex&) {
    // Success
  }
  catch(...) {
    throw; // Failure
  }
  QVERIFY(true);

  
  try {
    t.preCondition(); // should throw
    QVERIFY(false);
  } 
  catch(const Ex&) {
    // Success
  }
  catch(...) {
    throw; // Failure
  }
  QVERIFY(true);

  
  try {
    t.postCondition(); // should throw
    QVERIFY(false);
  } 
  catch(const Ex&) {
    // Success
  }
  catch(...) {
    throw; // Failure
  }  
  QVERIFY(true);
  
}

